package lider;

public class MockAerolineaLanchita {

	private String[][] asientos;

	public MockAerolineaLanchita() 
	{
		this.setAsientos(new String[][] 
				{
					{ "01202022220202-3", "159.90", "P", "V", "D", "", "14:00","02:25","EZE","USA","20/12/2012","21/12/2012" },
					{ "01202022220123-3", "205.10", "E", "P", "D", "", "14:00","02:25","EZE","USA","20/12/2012","21/12/2012" },
					{ "01202012315523-8", "154.08", "T", "P", "D", "", "14:00","02:25","EZE","USA","20/12/2012","21/12/2012" },
					{ "01202022267867-7", "255.98", "E", "P", "D", "", "05:20","14:00","EZE","PER","20/12/2012","20/12/2012" },
					{ "01202022227897-3", "236.10", "T", "C", "D", "", "05:20","14:00","EZE","PER","20/12/2012","20/12/2012" },
					{ "01202022998988-6", "148.23", "T", "V", "D", "", "05:20","14:00","EZE","PER","20/12/2012","20/12/2012" },
					{ "01202022220008-3", "383.22", "E", "V", "D", "", "20:00","08:00","PER","USA","20/12/2012","21/12/2012" },
					{ "01202022256565-3", "282.19", "E", "C", "D", "", "20:00","08:00","PER","USA","20/12/2012","21/12/2012" },
					{ "01202022323423-5", "431.28", "T", "C", "D", "", "20:00","08:00","PER","USA","20/12/2012","21/12/2012" },
					{ "01202022220298-2", "528.81", "P", "V", "D", "", "07:00","08:00","AEO","USH","20/12/2012","21/12/2012" },
					// A partir de aca agrego asientos para testear
					// Estos son una escala de dos escalas para probar el for mas profundo
					{ "01202022220297-2", "528.81", "E", "V", "D", "", "14:10","08:00","PER","FRA","20/12/2012","21/12/2012" },
					{ "01202022220296-2", "528.81", "E", "V", "D", "", "09:00","10:00","FRA","USA","21/12/2012","21/12/2012" },
					// Este es un asiento que regresa al origen y no tiene que ser tomado en cuenta
					{ "01202022220295-2", "528.81", "P", "V", "D", "", "14:10","08:00","PER","EZE","20/12/2012","21/12/2012" },
					// No deber�a entrar porque sale antes que el vuelo 01202022220297-2 por la hora
					{ "01202022220294-2", "528.81", "P", "V", "D", "", "7:59","10:00","FRA","USA","20/12/2012","21/12/2012" },
					// No deber�a entrar porque sale antes que el vuelo 01202022220297-2 por la fecha
					{ "01202022220294-2", "528.81", "P", "V", "D", "", "7:59","10:00","FRA","USA","19/12/2012","21/12/2012" }
				});
	}

	// ****************************************************************
	// ** QUERIES
	// ****************************************************************

	private void setAsientos(String[][] strings) {
		this.asientos  = strings;
		
	}

	/**
	 * 
	 * Retorna el conjunto de los asientos disponibles para ir del origen al
	 * destino en la fecha solicitada. Los asientos devueltos estan
	 * representados por un array de Strings con la siguiente distribucion: <br>
	 * [0]: Codigo identificador del asiento. <br>
	 * [1]: Precio base del asiento. <br>
	 * [2]: Clase del asiento. Los valores pueden ser "P" para Primera, "E" para
	 * Ejecutivo y "C" para Turista. <br>
	 * [3]: Ubicacion del asiento. Los valores pueden ser "V" para Ventana, "C"
	 * para Centro y "P" para Pasillo. <br>
	 * [4]: Estado del asiento. Los valores pueden ser "D" para Disponible, "R"
	 * para Reservado y "C" para Comprado. En esta consulta solo se devolveran
	 * asientos "D". <br>
	 * [5]: DNI del cliente que reservo o compro el asiento. En esta consulta
	 * vendra siempre vacio. <br>
	 * [6]: horario de salida del vuelo con el formato hh:mm. <br>
	 * [7]: horario de llegada del vuelo con el formato hh:mm. <br>
	 * [8]: origen del vuelo<br>
	 * [9]: destino del vuelo<br>
	 * [10]: fecha de salida del vuelo con el formato dd/mm/aaaa<br>
	 * [11]: fecha de llegada del vuelo con el formato dd/mm/aaaa<br>
	 * 
	 * @param origen
	 *            Identificador del lugar de origen
	 * @param destino
	 *            Identificador del lugar de destino
	 * @param fecha
	 *            Fecha en la que se realizara el viaje
	 * 
	 * @return Array con asientos disponibles para ser reservados o comprados.
	 */
	public String[][] asientosDisponibles(String origen, String destino, String fechaSalida, String horaSalida, String fechaLlegada, String horaLlegada) 
	{
		boolean[] auxiliar = new boolean[asientos.length];
		int cantidad = 0;
		
		for( int i = 0 ; i < asientos.length ; i++)
		{
			boolean coincide = this.coincideConLaBusqueda(asientos[i],origen,destino,fechaSalida,horaSalida,fechaLlegada,horaLlegada);
			if(coincide)
				cantidad++;
			auxiliar[i] = coincide;
		}
		int indice = 0;
		String[][] asientosADevolver = new String[cantidad][12];
		for( int j = 0 ; j < auxiliar.length ; j++ )
		{
			if(auxiliar[j])
			{
				asientosADevolver[indice] = asientos[j];
				indice++;
			}
		}
				
		return asientosADevolver;

	}
	
	public boolean coincideConLaBusqueda(String[] asiento, String origen, String destino, String fechaSalida, String horaSalida, String fechaLlegada, String horaLlegada)
	{
		boolean estaDisponible = (asiento[4].contentEquals("D"));
		boolean coincideHoraSalida = (horaSalida == asiento[6]) || (horaSalida == null);
		boolean coincideHoraLlegada = (horaLlegada == asiento[7]) || (horaLlegada == null);
		boolean coincideOrigen = (origen == asiento[8]) || (origen == null);
		boolean coincideDestino = (destino == asiento[9]) || (destino == null);
		boolean coincideFechaDeSalida = (fechaSalida == asiento[10]) || (fechaSalida == null);
		boolean coincideFechaDeLlegada = (fechaLlegada == asiento[11]) || (fechaLlegada == null);
	
		return (estaDisponible && coincideHoraSalida && coincideHoraLlegada && coincideOrigen && coincideDestino && coincideFechaDeSalida && coincideFechaDeLlegada);
	}

	public void comprar(String codigoDeVueloAsiento) {
		int i;
		boolean loEncontre=false;
		for(i=0;i<asientos.length && !loEncontre;i++){
			if(	this.asientos[i][0].contentEquals(codigoDeVueloAsiento) && asientos[i][4].contentEquals("D")){
				asientos[i][4]="O";
				loEncontre=true;
			}
		}
		if(!loEncontre)
			throw new AsientoLanchitaNoDisponibleException("El asiento ya estaba reservado/comprado!");
		//Damos por sentado que NUNCA le vamos a pasar un cc´odigo de asiento inv´alido
	}

	public void reservar(String codigoDeAsiento, String dni) {
		// TODO El que tenga que probar esto que lo programe como quiera
	}
	

}